﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Web;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionCliente;
using ClickLand.CorporacionPlaza.Presentacion.Controladores;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using ClickLand.CorporacionPlaza.Utilidades;
using iTextSharp.text;
using iTextSharp.text.pdf;
using ListItem = System.Web.UI.WebControls.ListItem;

namespace ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionCliente
{
    /// <summary> Clase que hace de presnetador para la vista que administra cliente </summary>
    public class PresentadorAdministrarCliente:PresentadorBase
    {
        /// <summary> Variable que posee la definicion de la vista </summary>
        private readonly IAdministrarCliente _vista;


        /// <summary> Variable que posee la definicion del controlador del modulo </summary>
        private readonly ControladorAdministracionCliente _controlador;


        /// <summary> Variable que posee la definicion del controlador del modulo </summary>
        private readonly ControladorAdministracionContrato _controladorContrato;

        #region Atributos

        #endregion

        #region Constructor

        /// <summary> Contructor de la clase </summary>
        /// <param name="vista">informacion  de la vista</param>
        public PresentadorAdministrarCliente(IAdministrarCliente vista)
        {
            _vista = vista;
            _controlador = new ControladorAdministracionCliente();
            _controladorContrato = new ControladorAdministracionContrato();
        }

        #endregion

        #region Metodos
        /// <summary> Metodo que se encarga de la carga de la pagina </summary>
        public void CargarPagina()
        {
            CargarListaConValor(_vista.Estados, "estados", false);
            CargarListaSinValor(_vista.CodigoAreaCelular, "codigoAreaCelular", false);
            CargarListaSinValor(_vista.TipoCliente, "tipoCliente", false);
        }


        /// <summary> Metodo que realiza las operaciones para consultar los clientes </summary>
        public void ConsultarClientes()
        {
            var cliente = new ClienteDto();
            cliente.Nombre = _vista.NombreBusqueda.Text;
            if(_vista.Estados.SelectedIndex != 0)
                cliente.Estado = Convert.ToInt32(_vista.Estados.SelectedValue);
            List<ClienteDto> lista = _controlador.ConsultarCliente(cliente);
            HttpContext.Current.Session["listaCliente"] = lista;
            _vista.Clientes.DataSource = lista;
            _vista.Clientes.DataBind();
        }
        #endregion


        /// <summary> Metodo que muestra el detalle de un cliente </summary>
        /// <param name="id">identificador del cliente</param>
        public void MostrarDetalle(int id)
        {
            List<ClienteDto> lista = (List<ClienteDto>)HttpContext.Current.Session["listaCliente"];
            ClienteDto cliente = (from objeto in lista
                        where objeto.Id == id
                        select objeto).First();
            HttpContext.Current.Session["Cliente"] = cliente;
            _vista.NombreDetalle.Text = cliente.Nombre;
            _vista.CorreoDetalle.Text = cliente.Correo;
            _vista.DocumentoIdentificacionDetalle.Text = cliente.DocumentoIdentificacion;
            _vista.NumeroCelularDetalle.Text = cliente.NumeroCelular;
            _vista.NumeroOficinaDetalle.Text = cliente.NumeroOficina;
            _vista.Responsable1Detalle.Text = cliente.Responsable1;
            _vista.Responsable2Detalle.Text = cliente.Responsable2;
            _vista.Responsable3Detalle.Text = cliente.Responsable3;
            _vista.TipoClienteDetalle.Text = cliente.Tipo;
            _vista.Paneles.SetActiveView(_vista.VistaDetalle);
            _vista.EsClienteJuridico = !cliente.Tipo.Equals("Natural");

            ContratoDto contrato = new ContratoDto {Cliente = new ClienteDto {Id = cliente.Id}, Estado = -1};
            _vista.ListaContratos.DataSource = _controladorContrato.BuscarContrato(contrato);
            _vista.ListaContratos.DataBind();

        }


        /// <summary> Metodo que realiza las operaciones para mostrar los controles para la edicion del cliente </summary>
        public void MostrarEdicion()
        {
            ClienteDto cliente = (ClienteDto)HttpContext.Current.Session["Cliente"]; 
            _vista.Nombre.Text = cliente.Nombre;
            _vista.Correo.Text = cliente.Correo;
            _vista.TipoCliente.SelectedValue = _vista.TipoCliente.Items.FindByText(cliente.Tipo).Value;
            SeleccionarTipoCliente();
            _vista.LetraCedulaRif.SelectedValue = cliente.DocumentoIdentificacion.Substring(0, 1);
            _vista.CedulaRif.Text = cliente.DocumentoIdentificacion.Substring(1);
            _vista.TelefonoCelular.Text = cliente.NumeroCelular.Substring(4);
            _vista.CodigoAreaCelular.SelectedValue = cliente.NumeroCelular.Substring(0, 4);
            _vista.TelefonoOficina.Text = cliente.NumeroOficina.Substring(4);
            _vista.CodigoAreaOficina.Text = cliente.NumeroOficina.Substring(0, 4);
            _vista.Responsable1.Text = cliente.Responsable1;
            _vista.Responsable2.Text = cliente.Responsable2;
            _vista.Responsable3.Text = cliente.Responsable3;

            _vista.Paneles.SetActiveView(_vista.VistaModificacion);
        }


        /// <summary> Metodo que realiza las operaciones para mostrar la confirmacion de la edicion </summary>
        public void MostrarConfirmacion()
        {
            _vista.NombreConfirmacion.Text = _vista.Nombre.Text;
            _vista.CorreoConfirmacion.Text = _vista.Correo.Text;
            _vista.DocumentoIdentificacionConfirmacion.Text = _vista.LetraCedulaRif.SelectedValue + _vista.CedulaRif.Text;
            _vista.NumeroCelular.Text = _vista.CodigoAreaCelular.Text + _vista.TelefonoCelular.Text;
            _vista.NumeroOficina.Text = _vista.CodigoAreaOficina.Text + _vista.TelefonoOficina.Text;
            _vista.Responsable1Confirmacion.Text = _vista.Responsable1.Text;
            _vista.Responsable2Confirmacion.Text = _vista.Responsable2.Text;
            _vista.Responsable3Confirmacion.Text = _vista.Responsable3.Text;
            _vista.TipoClienteConfirmacion.Text = _vista.TipoCliente.SelectedItem.Text;
            _vista.Paneles.SetActiveView(_vista.VistaConfirmacion);
        }


        /// <summary> Metodo que se encarga de las operaciones para agregar un cliente </summary>
        public void EditarCliente()
        {
            var cliente = (ClienteDto)HttpContext.Current.Session["Cliente"];
            cliente.Nombre = _vista.Nombre.Text;
            cliente.Correo = _vista.Correo.Text;
            cliente.DocumentoIdentificacion = _vista.LetraCedulaRif.SelectedValue + _vista.CedulaRif.Text;
            cliente.NumeroCelular = _vista.CodigoAreaCelular.Text + _vista.TelefonoCelular.Text;
            cliente.NumeroOficina = _vista.CodigoAreaOficina.Text + _vista.TelefonoOficina.Text;
            cliente.Responsable1 = _vista.Responsable1.Text;
            cliente.Responsable2 = _vista.Responsable2.Text;
            cliente.Responsable3 = _vista.Responsable3.Text;
            cliente.Tipo = _vista.TipoCliente.SelectedItem.Text;

            _vista.Paneles.SetActiveView(_controlador.AgregarModificarCliente(cliente)
                                             ? _vista.VistaExito
                                             : _vista.VistaError);

        }


        /// <summary>
        /// Metodo que llena el dropdownlist segun la seleccion del cliente
        /// </summary>
        public void SeleccionarTipoCliente()
        {

            _vista.EsClienteJuridico = !_vista.TipoCliente.SelectedValue.Equals("Natural");
            _vista.LetraCedulaRif.Items.Clear();
            _vista.LetraCedulaRif.Items.Add(new ListItem(" "));
            CargarListaSinValor(_vista.LetraCedulaRif,
                                _vista.TipoCliente.SelectedValue.Equals("Natural")
                                    ? "letraRifNatural"
                                    : "letraRifJuridico", false);
        }


        /// <summary> Metodo que realiza la operacion para imprimir los reportes </summary>
        public void ImprimirReporte()
        {
            Document document = new Document();
            PdfWriter writer = PdfWriter.GetInstance(document,
                                  new FileStream(ConfigurationManager.AppSettings["RutaDescarga"] +
                                      "ReporteConsultaCliente.pdf", FileMode.Create));
            PdfPTable tabla;
            PdfPCell celdaTitulo;
            string[] titulosCeldas;
            Paragraph ptitulo;
            Chunk titulo;

            try
            {
                document.SetMargins(36, 36, 36, 100);
                document.Open();


                #region Cuerpo del Reporte


                #region Tabla Historico Planes


                #region Titulo de Tabla
                titulo = new Chunk("Clientes \n\n",
                                         FontFactory.GetFont("Verdana", 11, Font.BOLD));
                ptitulo = new Paragraph();
                ptitulo.Alignment = Element.ALIGN_CENTER;
                ptitulo.Add(titulo);
                document.Add(ptitulo);
                #endregion

                var lista = (List<ClienteDto>)HttpContext.Current.Session["listaCliente"];
                if (lista.Count > 0)
                {
                    #region Encabezado de la tabla
                    tabla = new PdfPTable(8);
                    //tabla.SpacingBefore = 10;
                    tabla.WidthPercentage = 100;
                    tabla.HorizontalAlignment = Element.ALIGN_LEFT;
                    titulosCeldas = _vista.TituloReporte.Split(';');


                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[0], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;

                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[1], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[2], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[3], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[4], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[5], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[6], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[7], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    #endregion

                    #region Cuerpo de la Tabla

                    ContratoDto contrato = null;

                    foreach (var cliente in lista)
                    {
                        if(cliente.Estado != 0)
                        {
                            var listaContrato = _controladorContrato.BuscarContrato(new ContratoDto{Cliente =new ClienteDto{Id = cliente.Id},Estado = 1});
                            if (listaContrato.Count > 0)
                                contrato = listaContrato[0];
                            else
                                cliente.Estado = 0;
                        }
                            
                        BaseColor color = ((cliente.Estado == 0)) ? BaseColor.RED : BaseColor.WHITE;
                        PdfPCell celdaContenido = new PdfPCell(new Phrase(contrato != null ? contrato.Establecimiento.Numero:"_", FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(contrato != null ? contrato.Establecimiento.Tipo.Descripcion : "_", FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(contrato != null ? contrato.NombreComercial : "_", FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(cliente.Nombre, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(cliente.NumeroOficina, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(cliente.NumeroCelular, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(cliente.Responsable1, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(cliente.Correo, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);
                    }

                    document.Add(tabla);

                    #endregion
                }
                else
                {

                    Paragraph parrafo = new Paragraph(new Chunk("No Existe Clientes \n\n",
                                                                FontFactory.GetFont("Verdana", 10, Font.BOLD)));
                    parrafo.Alignment = Element.ALIGN_CENTER;
                    document.Add(parrafo);
                }


                #endregion


                #endregion

                #region Agrego funcion javascript para que se abra el dialogo de impresión

                string jsText =
                    "var res = app.setTimeOut('var pp = this.getPrintParams();pp.interactive = pp.constants.interactionLevel.full;this.print(pp);', 200);";
                PdfAction js = PdfAction.JavaScript(jsText, writer);
                writer.AddJavaScript(js);

                #endregion

                document.Close();
            }
            catch (Exception e)
            {
                if (document.IsOpen())
                    document.Close();
            }
        }
    }
}
